﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace T.FAS.Runtime.MF.Common
{
    internal class LiquidExpressionValidator
    {
        private static readonly Regex LiquidRegex = new Regex(
      @"^\s*(?<tag>\{\{|%\{)(?<content>.*?)(?<endtag>%?\})\s*$",
      RegexOptions.Singleline | RegexOptions.Compiled
  );

        /// <summary>
        /// 判断字符串是否为有效的 Liquid 表达式并返回中间内容
        /// </summary>
        /// <param name="input">输入的字符串</param>
        /// <param name="liquidExpression">输出的 Liquid 表达式内容（仅中间部分）</param>
        /// <returns>如果是有效的 Liquid 表达式返回 true，否则返回 false</returns>
        public static bool IsLiquidExpression(string input, out string liquidExpression)
        {
            liquidExpression = "";

            if (string.IsNullOrWhiteSpace(input))
                return false;

            var match = LiquidRegex.Match(input);
            if (!match.Success)
                return false;

            string startTag = match.Groups["tag"].Value;
            string endTag = match.Groups["endtag"].Value;
            string content = match.Groups["content"].Value.Trim();

            // 验证标签配对
            if (!IsValidTagPair(startTag, endTag))
                return false;

            // 验证内容有效性
            if (!IsValidContent(content))
                return false;

            liquidExpression = content;
            return true;
        }

        private static bool IsValidTagPair(string startTag, string endTag)
        {
            return (startTag, endTag) switch
            {
                ("{{", "}}") => true,
                ("{%", "%}") => true,
                _ => false
            };
        }

        private static bool IsValidContent(string content)
        {
            // 内容不能为空
            if (string.IsNullOrWhiteSpace(content))
                return false;

            // 至少包含一个有效字符（字母、数字、下划线）
            if (!Regex.IsMatch(content, @"\w"))
                return false;

            // 不能包含未闭合的 Liquid 标签
            if (Regex.IsMatch(content, @"\{\{|\{\%|\}\}|\%\}", RegexOptions.Singleline))
                return false;

            return true;
        }
    }
}
